package com.soyotec.algorithm.problem;

import com.soyotec.algorithm.solution.Solution;
import com.soyotec.algorithm.value.Limit;

import java.io.Serializable;
import java.util.List;

/**
 * 问题接口
 *

 */
public interface Problem<S extends Solution> extends Serializable {

    /**
     * 获取设计变量个数
     *
     * @return 设计变量个数
     */
    int getNumberOfVariables();

    /**
     * 获取目标函数个数
     *
     * @return 目标函数个数
     */
    int getNumberOfObjectives();

    /**
     * 获取约束条件个数
     *
     * @return 约束条件个数
     */
    int getNumberOfConstraints();

    /**
     * 获取权重化目标函数个数
     *
     * @return 目标函数个数
     */
    int getNumberOfWeightObjectives();
    /**
     * 获取问题名称
     *
     * @return 问题名称
     */
    String getName();

    /**
     * 评估单个问题
     *
     * @param var1 问题
     */
    void evaluate(S var1);

    /**
     * 评估问题集合
     *
     * @param var1 问题集合
     */
    void evaluate(List<S> var1);

    /**
     * 创建解决方案
     *
     * @return 解决方案
     */
    S createSolution();

    /**
     * 创建初始解决方案
     *
     * @return
     */
    S createInitSolution();

    Limit getVariableLimit(int var1);
    /**
     * 获取上限
     *
     * @param var1 下标指数
     * @return 上限
     */
    Limit getConstraintLimit(int var1);

    Limit getRealTypeVariableLimit(int var1);

    String getAlgorithmName();

    Integer getArrayDimension();

}